
//1.Lock方法的源码
执行lock方法，公平锁和非公平锁的执行套路不一样 
 lock{
 	acquire(参数为:1){// 执行acquire，尝试获取锁资源
 		tryAcquire(1){  // 当前线程是否可以尝试获取锁资源
 			hasQueuedPredecessors()  // 查看是否有线程在AQS的双向队列中排队  返回false，代表没人排队
 			&&
 			acquireQueued(// acquireQueued：查看我是否是第一个排队的节点，如果是可以再次尝试获取锁资源，如果长时间拿不到，挂起线程
 				await(){// addWaiter(Node.EXCLUSIVE)：将当前线程封装为Node节点，插入到AQS的双向链表的结尾
 					enq(node){  // 如果CAS失败，以死循环的方式，保证当前线程的Node一定可以放到AQS队列的末尾
 					}
 				},1
 			){
 				setHead(node);// 获取锁资源成功后，先执行setHead
 				shouldParkAfterFailedAcquire(node,node);// shouldParkAfterFailedAcquire：基于上一个节点转改来判断当前节点是否能够挂起线程，如果可以返回true 。 如果不能，就返回false，继续下次循环
 			}
 			selfInterrupt; // 中断线程的操作
 		}
 	}
 }



//2. tryLock方法  
trylock(){ //不带单位
    // tryLock方法，无论公平锁还有非公平锁。都会走非公平锁抢占锁资源的操作 就是拿到state的值， 如果是0，直接CAS浅尝一下
    // state 不是0，那就看下是不是锁重入操作,如果没抢到，或者不是锁重入操作，告辞，返回false
    nonfairTryAcquire(1)  // 非公平锁的竞争锁操作
}


tryLock(time,unit){ //带单位
    // shouldParkAfterFailedAcquire：根据上一个节点来确定现在是否可以挂起线程
    shouldParkAfterFailedAcquire(node, node)
    // 如果拿锁失败，在这要等待指定时间
    doAcquireNanos(arg, nanosTimeout);

    finally{
        cancelAcquire(node) //取消在AQS中排队的Node,有好几种情况
    }
}


//3.lockInterruptibly()方法  死等,要么被别人中断,要么一直等下去
// 这个是lockInterruptibly和tryLock(time,unit)唯一的区别